let esUrl = null // 事件流的 URL
let attachedTabId = null // 附加到的标签页的 ID
let attachedSwId = null // 附加到的 Service Worker 的 ID
const esPathPrefix = '/__hcsy-sse-viewer' // 事件流的路径前缀 (自定义)
const bodyQueue = [] // 事件流的内容队列


// chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
//   console.log("onUpdated>>>>", tabId)
//   chrome.scripting.executeScript({
//     target: { tabId: tabId, allFrames: true },
//     files: ['pageScripts/main.js'],
//   }).then(() => {
//     // 传递platformId
  
//   })
// });

/**
 * Sends a command to the debugger attached to the specified target. 向附加到指定目标的调试器发送命令。
 * @param {Object} target - The target to send the command to. 发送命令的目标。
 * @param {string} method - The name of the method to call. 要调用的方法的名称。
 * @param {Object} params - The parameters to pass to the method. 要传递给方法的参数。
 * @returns {Promise} A Promise that resolves with the result of the command, or rejects with an error. 一个Promise，它解析命令的结果，或者拒绝一个错误。
 */
function sendCommand(target, method, params) {
  console.log("sendCommand>>>>", target)
  console.log("sendCommand>>>>", method)
  console.log("sendCommand>>>>", params)
  return new Promise((resolve, reject) => {
    chrome.debugger.sendCommand(target, method, params, function (result) {
      if (chrome.runtime.lastError) {
        reject(chrome.runtime.lastError)
      } else {
        resolve(result)
      }
    })
  })
}

// 图标被点击时，事件监听器被触发，执行监听器内的代码。
// popup 中打开和关闭插件的监听功能
chrome.action.onClicked.addListener(async function (tab) {
  console.log("onClicked>>>>", tab)
  console.log("onClicked>>attachedTabId>>", attachedTabId)
  if (attachedTabId) {
    // 主动关闭监听
    chrome.action.setIcon({
      tabId: attachedTabId,
      path: 'assets/icon-gray.png',
    })
    // chrome.debugger.detach 是 Chrome 扩展程序 API 中的一个方法，用于分离调试器与标签页
    chrome.debugger.detach({ tabId: attachedTabId }) // 分离调试器与标签页
    attachedSwId && chrome.debugger.detach({ targetId: attachedSwId }) // 分离调试器与 Service Worker
    attachedTabId = null // 重置 attachedTabId
    attachedSwId = null // 重置 attachedSwId
  } else {
    if (tab.url.startsWith('http')) { // 判断是否为 HTTP/HTTPS 页面
      // chrome.debugger.attach 是 Chrome 扩展程序 API 中的一个方法，用于附加调试器到标签页
      chrome.debugger.attach({ tabId: tab.id }, '1.2', async function () {
        attachedTabId = tab.id // 保存附加到的标签页的 ID
        chrome.action.setIcon({
          tabId: tab.id,
          path: 'assets/icon.png',
        })
        sendCommand({ tabId: tab.id }, 'Fetch.enable', { // 向附加到的标签页发送 Fetch.enable 命令
          patterns: [{ requestStage: 'Request' }, { requestStage: 'Response' }],  // 指定要捕获的请求阶段
        }) // 向附加到的标签页发送 Fetch.enable 命令
        // const targets = await chrome.debugger.getTargets()  // 获取所有调试目标
        // console.log("onClicked>>>>targets>>>>", targets)
        // const tabUrl = new URL(tab.url) // 获取标签页的 URL
        // console.log("onClicked>>>>tabUrl>>>>", tabUrl)
        // const swTarget = targets.find(
        //   (target) =>
        //     target.url.startsWith(tabUrl.origin) && target.type === 'worker', // 查找 Service Worker
        // )
        // console.log("onClicked>>>>swTarget>>>>", swTarget)
        // if (swTarget) { // 如果找到 Service Worker
        //   // attach to service worker
        //   chrome.debugger.attach(
        //     { targetId: swTarget.id },
        //     '1.2',
        //     async function () {
        //       attachedSwId = swTarget.id
        //       sendCommand({ targetId: swTarget.id }, 'Fetch.enable', {
        //         patterns: [
        //           { requestStage: 'Request' },
        //           { requestStage: 'Response' },
        //         ],
        //       })
        //     },
        //   )
        // }
      })
    } else {
      console.log('Debugger can only be attached to HTTP/HTTPS pages.') // 调试器只能附加到 HTTP/HTTPS 页面
    }
  }
})

// chrome.debugger.onDetach 是 Chrome 扩展程序 API 中的一个事件监听器，用于监听调试器与标签页的分离事件
// 当页面改变时，事件监听器被触发，执行监听器内的代码。
chrome.debugger.onDetach.addListener(function (_source, _reason) {
  console.log("onDetach>>>>", _source)
  console.log("onDetach>>>>", _reason)
  attachedTabId &&
    chrome.action.setIcon({
      tabId: attachedTabId,
      path: 'assets/icon-gray.png',
    })
  attachedTabId = null
  attachedSwId = null
})

chrome.debugger.onEvent.addListener(async function (source, method, params) {
  const reqUrl = new URL(params.request.url)
  if(reqUrl.pathname !== '/pc/text/stream/v2/mailText.htm') {
    return
  }
  console.log("onEvent>>>>", source)
  console.log("onEvent>>>>", method)
  console.log("onEvent>>>>", params)
  // chrome.debugger.onEvent 是 Chrome 扩展程序 API 中的一个事件监听器，用于监听调试器事件
  if (method === 'Fetch.requestPaused') {
    console.log("onEvent>>1>reqUrl.pathname>", reqUrl.pathname)
    console.log("onEvent>>1>esUrl>", esUrl)
    if (reqUrl.pathname === esUrl) {
      console.log("onEvent>>fulfillRequest>>>")
      console.log("onEvent>>bodyQueue>>>", JSON.stringify(bodyQueue))
      // await sendCommand(source, 'Fetch.fulfillRequest', {
      //   requestId: params.requestId,
      //   responseCode: 200,
      //   responseHeaders: [
      //     { name: 'Content-Type', value: 'text/event-stream' },
      //     { name: 'Cache-Control', value: 'no-cache' },
      //     { name: 'Date', value: new Date().toUTCString() },
      //   ],
      //   body: bodyQueue.shift(),
      // })
    } else {
      console.log("onEvent>2>>reqUrl.pathname>", reqUrl.pathname)
      const accept =
        params.request.headers.accept || params.request.headers.Accept || ''
      if (accept.includes('text/event-stream')) { // 如果请求头中包含 text/event-stream
        esUrl = `${esPathPrefix}${reqUrl.pathname}`
        if (params.responseHeaders) {

          sendCommand(source, 'Fetch.takeResponseBodyAsStream', {
            requestId: params.requestId,
          }).then(stream => {
            console.log("onEvent>>stream>>>", stream)
            const handle = new IO.StreamHandle(stream);
            handle.read().then((data) => {
              console.log(data.toString());
            });
            // const reader = stream.body.getReader()
            // const decoder = new TextDecoder('utf-8')
            // const pump = () => {
            //   reader.read().then(({ done, value }) => {
            //     if (done) {
            //       console.log('Stream complete')
            //       return
            //     }
            //     console.log(decoder.decode(value))
            //     pump()
            //   })
            // }
            // pump()
          })
          // sendCommand(source, 'Fetch.getResponseBody', {
          //   requestId: params.requestId,
          // })
          // const resp = await sendCommand(source, 'Fetch.getResponseBody', {
          //   requestId: params.requestId,
          // })
          // console.log("onEvent>>bodyQueue>>>", JSON.stringify(bodyQueue))
          //bodyQueue.push(resp.body)
          //console.log("resp.body",resp.body)
          chrome.tabs.sendMessage(attachedTabId, { type: 'create', url: esUrl })
          console.log("onEvent>>sendMessage>>esUrl>", esUrl)
        }
      }
      sendCommand(source, 'Fetch.continueRequest', {
        requestId: params.requestId,
      })
    }
  }
})


chrome.runtime.onConnect.addListener(port => {
  port.onMessage.addListener(message => {
    // console.log("onConnect>>>>", message)
  })
})


// 监听来自 content script 的消息
chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) {
  if (message.type === "message") {
    console.log("Received message: " + message.text);
    //console.log(chrome.debugger);
    // chrome.debugger.getTargets().then(targets => {
    //   console.log("getTargets>>>>", targets)
    // })
    // 给devtools下的panels页面发消息

    //chrome.runtime.sendMessage(chrome.runtime,id, { text: "background 的消息"});
  }
  if (message.type === "reply") {
    console.log("Received reply message: " + message.text);
  }
});